package com.ljx.offer;

import org.junit.Test;

import java.util.LinkedList;

/**
 * @author 李捷禧
 * Date: 2023/3/14
 * ClassName: C_21
 */

public class C_21 {
    //自己的做法
    //count 是用来记录奇数的索引

    /**
     * 自己的做法
     * count 是用来记录奇数的索引
     *
     * 点评: 思路无懈可击。属于快慢指针的思路
     *
     * @param nums
     * @return
     */
    public int[] exchange(int[] nums) {
        // 注意代码规范
        int count = 0 ;
        for (int i = 0; i < nums.length; i++) {
            //只有遍历到奇数就进行交换位置
            if(nums[i] % 2 != 0){
                int t = nums[i];
                nums[i] = nums[count];
                nums[count] = t;
                count++;
            }
        }
        return nums;
    }

    /**
     * 带你装一波
     * 二进制判断奇偶数
     * nums[i] % 2 != 0  -> (nums[i] & 1) == 1
     * 原理：
     *      &与运算，只有对应二进制位置为1，才为1，否则为0
     *      任何数与 1(0b00001) 进行与运算，会发生什么结果？
     *      2&1=0：
     *          0b0010
     *        & 0b0001
     *        = 0b0001
     *      3&1=1
     *          0b0011   3
     *        & 0b0001   1
     *        = 0b0001   1
     *
     *      因为任何数与上0都是0，所以其他位置不做考虑，只考虑最后一位，所以任何数&1，等同于取二进制中的最后一位，
     *      得出的结果，如果为1，就说明最后一位是1，为奇数，否则为偶数
     *
     * 做了这个优化，运行时间从2ms优化到1ms
     * @param nums
     * @return
     */
    public int[] exchange1(int[] nums) {
        int count = 0 ;
        for (int i = 0; i < nums.length; i++) {
            //只有遍历到奇数就进行交换位置
            if((nums[i] & 1) == 1){
                int t = nums[i];
                nums[i] = nums[count];
                nums[count] = t;
                count++;
            }
        }
        return nums;
    }

    /*
    //题解：这样运行时间比较长 todo 会长一些吗？ 疑问句，非反问句
    public int[] exchange(int[] nums) {
        int count = 0,fast = 0 ;
        while(fast < nums.length){
            if (nums[fast] % 2 != 0) NumChange(nums,count++,fast);
            fast++;
        }
        return nums;
    }

    private void NumChange(int[] nums, int i, int fast) {
        int t = nums[i];
        nums[i] = nums[fast];
        nums[fast] = t;
    }
    */

    @Test
  public void test() {
//      int[] arr = new int[]{1,3,6,4,8,9,4,6};
        int[] arr = new int[]{1,3,6,4,8,9,4,6};
      int[] exchange = exchange(arr);
      for (int i : exchange) {
          System.out.print(i + " ");
      }
  }
}
